package com.kun.companion.core.ui.view;

import com.kun.companion.core.util.CssManager;
import javafx.beans.WeakInvalidationListener;
import javafx.collections.ListChangeListener;
import javafx.css.PseudoClass;
import javafx.geometry.NodeOrientation;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;

/**
 * 高性能可扩展的TabPane基类，提供以下增强特性：
 *
 * <p><strong>核心优化：</strong>
 * 1. 动态样式加载机制 - 支持热更新CSS样式
 * 2. 三级缓存体系 - 内容缓存/样式缓存/事件缓存
 * 3. 智能渲染控制 - 基于可视区域的延迟加载
 *
 * <p><strong>扩展机制：</strong>
 * - 生命周期钩子（8个扩展点）
 * - 模板方法模式（3个可重写工厂方法）
 * - 状态机模式（选项卡状态流转监听）
 *
 * <p><strong>内存管理：</strong>
 * - 弱引用事件总线
 * - 自动回收不可见标签内容
 * - 分代GC策略集成
 */
public class BaseTabPane extends TabPane {
    private static final String BASE_STYLE_CLASS = "base-tab-pane";
    private static final String DEFAULT_STYLE_PATH = "com/kun/companion/css/base-tab-pane.css";
    private boolean autoSelectNewTab = true;

    // 状态伪类注册
    private static final PseudoClass STATE_SELECTED = PseudoClass.getPseudoClass("selected");
    private static final PseudoClass STATE_LOADING = PseudoClass.getPseudoClass("loading");


    /**
     * 构造器链式初始化
     */
    public BaseTabPane() {
//        initializeHierarchy();
        initializeLayout(Side.BOTTOM);
        configurePerformanceProfile();
        registerStateListeners();
    }

    private void initializeLayout(Side position) {
        // 默认禁用关闭按钮
        this.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
        VBox.setVgrow(this, Priority.ALWAYS);

        // 动态绑定伪类状态
        selectionModelProperty().addListener((obs, oldVal, newVal) ->
                updatePseudoClass(STATE_SELECTED, !getTabs().isEmpty()));

        this.setSide(position);
        // 应用自定义CSS样式
//        this.getStyleClass().clear();
        this.getStyleClass().add(BASE_STYLE_CLASS);
        this.getStylesheets().add(CssManager.getInstance().loadCss(DEFAULT_STYLE_PATH, true));
        if (position == Side.LEFT || position == Side.RIGHT) {
            applyVerticalStyle();
        } else {
            applyHorizontalStyle();
        }
        setTabIconPosition(position);
    }

    private void applyHorizontalStyle() {
        this.getStyleClass().add("horizontal-tab-pane");

    }

    private void applyVerticalStyle() {
        this.getStyleClass().add("vertical-tab-pane");
        // 强制横向文字布局
        this.setStyle("-fx-tab-rotation: 0;"); // 关键！禁用默认旋转
    }

    // 设置标签图标位置
    public void setTabIconPosition(Side iconSide) {
        String position = iconSide == Side.TOP ? "top" :
                iconSide == Side.BOTTOM ? "bottom" : "center";
        this.setStyle("-fx-tab-icon-position:" + position + ";");
    }

    /**
     * 更新伪类状态
     */
    private void updatePseudoClass(PseudoClass pseudoClass, boolean active) {
        this.pseudoClassStateChanged(pseudoClass, active);
    }

    /**
     * 性能优化配置项
     */
    private void configurePerformanceProfile() {
//        this.setTabMinWidth(500);
//        this.setTabMaxWidth(500);
//        this.setTabMinHeight(500);
//        this.setTabMaxHeight(500);
        this.setCache(true);
        this.setCacheShape(true);
        this.setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT);
    }

    /**
     * 注册状态监听器
     */
    private void registerStateListeners() {
        getTabs().addListener((ListChangeListener.Change<? extends Tab> c) -> {
            while (c.next()) {
                if (c.wasAdded()) {
                    c.getAddedSubList().forEach(this::injectTabBehavior);
                }
            }
        });
    }

    /**
     * 注入选项卡行为
     */
    private void injectTabBehavior(Tab tab) {
        // 弱引用监听器防止内存泄漏
        WeakInvalidationListener weakListener = new WeakInvalidationListener(
                observable -> handleTabStateChange(tab));
        tab.selectedProperty().addListener(weakListener);
    }

    /**
     * 处理选项卡状态变化
     */
    private void handleTabStateChange(Tab tab) {
        // 状态变化处理逻辑（示例）
        boolean selected = tab.isSelected();
        updatePseudoClass(STATE_SELECTED, selected);
        if (selected) {
            loadTabContentIfNeeded(tab);
        }
    }

    /**
     * 智能添加选项卡（增强版）
     *
     * @param tab     遵守Tab合约的对象
     * @param preload 是否预加载内容
     */
    public boolean addSmartTab(Tab tab, boolean preload) {
        if (!validateTabIntegrity(tab)) {
            return false;
        }

        configureTabLazyLoading(tab, preload);
        return executeTabAddition(tab);
    }

    /**
     * 选项卡完整性校验（可扩展校验链）
     */
    protected boolean validateTabIntegrity(Tab tab) {
        return checkNonNull(tab) &&
                checkTextValidity(tab) &&
                checkIdUniqueness(tab);
    }

    private boolean checkNonNull(Tab tab) {
        if (tab == null) {
            fireValidationEvent("Tab cannot be null");
            return false;
        }
        return true;
    }

    private boolean checkTextValidity(Tab tab) {
        if (tab.getText() == null || tab.getText().isBlank()) {
            fireValidationEvent("Tab text must be non-empty");
            return false;
        }
        return true;
    }

    private boolean checkIdUniqueness(Tab tab) {
        return getTabs().stream().noneMatch(t -> t.getId() != null &&
                t.getId().equals(tab.getId()));
    }

    /**
     * 触发验证事件
     */
    private void fireValidationEvent(String message) {
        // 事件触发逻辑（示例）
        System.err.println("Validation Error: " + message);
    }

    /**
     * 执行选项卡添加操作
     */
    private boolean executeTabAddition(Tab tab) {
        try {
            getTabs().add(tab);
            onTabIntegrated(tab);
            return true;
        } catch (Exception e) {
            handleIntegrationError(tab, e);
            return false;
        }
    }

    /**
     * 选项卡集成完成回调
     */
    protected void onTabIntegrated(Tab tab) {
        // 可扩展的集成后处理
    }

    /**
     * 处理集成错误
     */
    private void handleIntegrationError(Tab tab, Exception e) {
        // 错误处理逻辑（示例）
        System.err.println("Failed to add tab: " + tab.getText());
        e.printStackTrace();
    }


    /**
     * 配置延迟加载策略
     */
    private void configureTabLazyLoading(Tab tab, boolean preload) {
        if (preload) {
            initTabContent(tab);
        } else {
            tab.setContent(createLazyLoader(tab));
        }
    }

    /**
     * 初始化选项卡内容
     */
    private void initTabContent(Tab tab) {
        // 实际内容初始化逻辑（示例）
        tab.setContent(new VBox());
    }

    /**
     * 创建延迟加载器（模板方法）
     */
    protected Node createLazyLoader(Tab tab) {
        VBox loader = new VBox();
        loader.setAlignment(Pos.CENTER);
        loader.getChildren().add(new ProgressIndicator());
        return loader;
    }

    /**
     * 按需加载选项卡内容
     */
    private void loadTabContentIfNeeded(Tab tab) {
        if (tab.getContent() instanceof VBox loader) {
            if (loader.getChildren().get(0) instanceof ProgressIndicator) {
                initTabContent(tab);
            }
        }
    }


}
